package com.itdct.onflow.generator.model

import com.alibaba.fastjson2.annotation.JSONField
import com.itdct.onflow.core.constant.DataPermissionEnum
import com.itdct.onflow.core.entity.IdEntity
import java.io.File

/**
 * @author DCTANT
 * @date 2022/2/10 10:01:26
 * @version 1.0
 * @description
 */
class ClassModel {

    /**
     * 原始类名
     */
    var entityClassName = ""

    /**
     * 不带entity的类名
     */
    var className = ""

    /**
     * 不带Entity类名，且首字母为小写
     */
    var classNameLowCamel = ""

    /**
     * 关联类信息（非常重要！）
     */
    @JSONField(serialize = false)
    var clazz: Class<out IdEntity>? = null

    /**
     * 完整的类名
     */
    var fullClassName = ""

    /**
     * 不带entity的包名
     */
    var packageName = ""

    /**
     * 包名带entity
     */
    var packageNameWithEntity = ""
    var moduleName = ""

    var fieldList = ArrayList<FieldModel>()

    var annotationList = ArrayList<AnnotationModel>()

    /**
     * 类用途
     */
    var classUsage = ""

    /**
     * schema名（MySQL中无需使用）
     */
    var schemaName = ""

    /**
     * 数据库表名
     */
    var tableName = ""

    /**
     * 缩写表名
     */
    var tableNameAbbr = ""

    var indexList = ArrayList<IndexModel>()
    var uniqueList = ArrayList<IndexModel>()
    var primaryKeyList = ArrayList<IndexModel>()

    var superClassName = ""

    @JSONField(serialize = false)
    var superClass: Class<*>? = null

    var version = "1.0"

    var haveLogicDelete = false

    var logicDeleteFieldName = ""

    /**
     * vue中使用的api路径，主要是将多个单词拼接而成的改为a/b/c
     */
    var vueApiPath = ""

    var tableEngine = ""

    var autoIncrement = 0L

    var charset = ""

    var collate = ""

    var haveDict = false

    /**
     * 该Entity文件的uuid
     */
    var fileUuid = ""

    /**
     * 该Entity文件的路径
     */
    var entityFilePath = ""

    @JSONField(serialize = false)
    var entityFile: File? = null

    /**
     * 表结构自动更新
     */
    var tableAutoSync = true

    /**
     * 数据权限枚举
     */
    var dataPermissionEnum = DataPermissionEnum.NONE

    /**
     * 缩写表名列表，为了防止出现在xml中出现相同的表名缩写，导致SQL语句报错，该值为动态生成，不需要保存到log中
     */
    @JSONField(serialize = false)
    val tableNameAbbrSet = HashSet<String>()

    // INFO: Zhouwx: 2025/3/26 vue route相关
    var vueViewPath = ""

    var vueMenuPath = ""

    /**
     * 是否已经同步过数据库菜单了
     */
    var syncMenu = false

    /**
     * 是否已经同步过API接口了
     */
    var syncApi = false

    /**
     * 是否已经同步过API和菜单的关联关系
     */
    var syncApiMenu = false

    /**
     * 是否已经同步过组件
     */
    var syncComponent = false

}